昨天介紹完DBSCAN演算法,今天就要來寫DBSCAN程式:
首先利用昨天創建好資料
首先先設置r = 10(半徑) ;m=3(最小群數)
首先先創建距離函數:
程式如下:
#兩筆data之間距離
def x_y_dist(data1,data2):
return np.sqrt((data1[0]-data2[0])**2+(data1[1]-data2[1])**2)
接下來創建分類函數:
程式如下:
import copy
def check_data(data_index,check_index,z1=[]):
L1=[]
#在範圍內資料就添加(不含自己)
for j in data_index:
k=x_y_dist([label_data_x[check_index],label_data_y[check_index]],[label_data_x[j],label_data_y[j]])
if k<=r and check_index!=j:
L1.append(j)
#若沒有就說明範圍內除了他和已排除點沒有其他
if len(L1)==0:
return {check_index}
#如果有就要看範圍內其他點是否包含其他點
else:
z1.extend(L1)
z1.append(check_index)
L2=copy.deepcopy(L1)
data_index_no=[i for i in data_index if i not in L2]
for i in L2:
#其他點帶回來這個函數
check_data(data_index_no,i,z1)
return set(z1)
創建好,之後就針對全部點去尋找,程式如下:
#針對所有點去分類
data_index_use=[i for i in range(len(label_data))]
label_set=[]
for i in range(len(label_data)):
label_check=check_data(data_index_use,i,z1=[])
#不要添加重複組
if label_check not in label_set:
label_set.append(label_check)
print(label_set)
所以就會得到結果:
[{0, 1, 7, 8, 17}, {9, 2, 10, 12}, {16, 3}, {11, 4, 5}, {15, 13, 6, 14}]
所以總共是分五組(原本照m=3)規則,即使{16,3}為一組也只能算局外點
(不過,因為就一組,所以還是幫他們上色-->實務在做,是不成一組都同一顏色)
接下來,就是繪圖,程式如下:
color_used=[]
#創建隨機顏色
for k in range(len(label_set)):
while True:
color_use = ["#"+''.join([random.choice('0123456789ABCDEF') for j in range(6)])]
if color_use not in color_used:
color_used.append(color_use)
break
for i in range(len(label_set)):
#每一組資料顏色分類
for j in label_set[i]:
plt.scatter(label_data_x[j],label_data_y[j],color=color_used[i])
plt.show()
所以圖如下:
這下了分類就完成,好,今天完成了DBSCAN,明天就來研究神經網路
狐狸起身往男孩右方走去,男子往左方走去,對男孩形成包夾之勢,然後慢慢靠近男孩,慢慢靠近…,突然兩人同時衝向男孩,只是娃娃一抬手,兩人飛了出去,但狐狸在空中一個扭身,又瞬間衝向男孩,娃娃來不急抬手,被狐狸的爪子給打飛了出去,男子接住了飛過來的娃娃,隨即娃娃全身著火,但娃娃看起來像是沒事,而男孩卻身體開始著火並痛苦的倒下
--|一起感受火燒的痛苦以及餘燼的感覺|-- MC.SM